package psrc.bd.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import psrc.logic.util.beans.PedidoBean;
import psrc.logic.util.beans.Romaneio;
import psrc.logic.util.beans.StatusPagamento;

public class PedidoDAO extends AbstractDAO {

	public PedidoDAO(Connection conn) {
		super(conn);
	}

	@Override
	public <T> void adiciona(T _bean) throws SQLException {
		PedidoBean bean = (PedidoBean) _bean;
		String sql = "insert into Pedido "
				+ "(fk_cliente, fk_representante, fk_fabrica, data_pedido, data_envio, data_confirmacao, numero_pedido, data_faturamento, data_liquidacao, data_entrega, status_pagamento, romaneio, observacoes) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CAST(? AS status_pagamento), CAST(? AS romaneio), ?)";
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setInt(1, bean.getFkCliente());
			stmt.setInt(2, bean.getFkRepresentante());
			stmt.setInt(3, bean.getFkFabrica());
			stmt.setDate(4, bean.getDataPedido());
			stmt.setDate(5, bean.getDataEnvio());
			stmt.setDate(6, bean.getDataConfirmacao());
			stmt.setString(7, bean.getNumeroPedido());
			stmt.setDate(8, bean.getDataFaturamento());
			stmt.setDate(9, bean.getDataLiquidacao());
			stmt.setDate(10, bean.getDataEntrega());
			stmt.setString(11, bean.getStatusPagamento().toString());
			stmt.setString(12, bean.getRomaneio() != null ? bean.getRomaneio().toString() : "nao_confirmado");
			stmt.setString(13, bean.getObservacoes());
			
			stmt.execute();
			stmt.close();
	}

	@Override
	public <T> void remove(T _bean) {
		PedidoBean bean = (PedidoBean) _bean;
		try {
			PreparedStatement stmt = connection.prepareStatement("delete from Pedido where id_pedido=?");

			stmt.setInt(1, bean.getIdPedido());

			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public <T> void edita(T _bean) {
		PedidoBean bean = (PedidoBean) _bean;

		String sql = "update Pedido set " +"fk_cliente=?, fk_representante=?, fk_fabrica=?, data_pedido=?, data_envio=?, data_confirmacao=?, numero_pedido=?, data_faturamento=?, data_liquidacao=?, data_entrega=?, status_pagamento=?, romaneio=?, observacoes=? where pedido=?";
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setInt(1, bean.getFkCliente());
			stmt.setInt(2, bean.getFkRepresentante());
			stmt.setInt(3, bean.getFkFabrica());
			stmt.setDate(4, bean.getDataPedido());
			stmt.setDate(5, bean.getDataEnvio());
			stmt.setDate(6, bean.getDataConfirmacao());
			stmt.setString(7, bean.getNumeroPedido());
			stmt.setDate(8, bean.getDataFaturamento());
			stmt.setDate(9, bean.getDataLiquidacao());
			stmt.setDate(10, bean.getDataEntrega());
			stmt.setString(11, bean.getStatusPagamento().toString());
			stmt.setString(12, bean.getRomaneio().toString());
			stmt.setString(13, bean.getObservacoes());
			stmt.setInt(14, bean.getIdPedido());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public <T> List<T> seleciona() {
		List<PedidoBean> pedidos = new ArrayList<PedidoBean>();

		try {
			PreparedStatement stmt = connection.prepareStatement("select * from Pedido");

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				PedidoBean bean = new PedidoBean();
				bean.setFkCliente(rs.getInt("fk_cliente"));
				bean.setFkRepresentante(rs.getInt("fk_representante"));
				bean.setFkFabrica(rs.getInt("fk_fabrica"));
				bean.setDataPedido(rs.getDate("data_pedido"));
				bean.setDataEnvio(rs.getDate("data_envio"));
				bean.setDataConfirmacao(rs.getDate("data_confirmacao"));
				bean.setNumeroPedido(rs.getString("numero_pedido"));
				bean.setDataFaturamento(rs.getDate("data_faturamento"));
				bean.setDataLiquidacao(rs.getDate("data_liquidacao"));
				bean.setDataEntrega(rs.getDate("data_entrega"));
				bean.setStatusPagamento(StatusPagamento.valueOf(rs.getString("status_pagamento")));
				bean.setRomaneio(Romaneio.valueOf(rs.getString("romaneio")));
				bean.setObservacoes(rs.getString("observacoes"));
				bean.setIdPedido(rs.getInt("id_pedido"));

				pedidos.add(bean);
			}
			rs.close();
			stmt.close();
			return (List<T>) pedidos;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

@Override
	public <T> List<T> selecionaPorId(T param) throws SQLException {
		List<PedidoBean> pedidos = new ArrayList<PedidoBean>();
		PedidoBean user = (PedidoBean) param;
		try {
			PreparedStatement stmt = connection
					.prepareStatement("select * from Pedido where id_pedido=?");
			stmt.setInt(1, user.getIdPedido());
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				PedidoBean bean = new PedidoBean();
				bean.setFkCliente(rs.getInt("fk_cliente"));
				bean.setFkRepresentante(rs.getInt("fk_representante"));
				bean.setFkFabrica(rs.getInt("fk_fabrica"));
				bean.setDataPedido(rs.getDate("data_pedido"));
				bean.setDataEnvio(rs.getDate("data_envio"));
				bean.setDataConfirmacao(rs.getDate("data_confirmacao"));
				bean.setNumeroPedido(rs.getString("numero_pedido"));
				bean.setDataFaturamento(rs.getDate("data_faturamento"));
				bean.setDataLiquidacao(rs.getDate("data_liquidacao"));
				bean.setDataEntrega(rs.getDate("data_entrega"));
				bean.setStatusPagamento(StatusPagamento.valueOf(rs.getString("status_pagamento")));
				bean.setRomaneio(Romaneio.valueOf(rs.getString("romaneio")));
				bean.setObservacoes(rs.getString("observacoes"));
				bean.setIdPedido(rs.getInt("id_pedido"));

				pedidos.add(bean);
			}
			rs.close();
			stmt.close();
			return (List<T>) pedidos;
		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
	}
}
